#ifndef CPP_EDIT_TEXT
#define CPP_EDIT_TEXT

#include <widget/TextView.h>
#include <utils/InputMethodManager.h>

/* 参考代码
    EditText* editText = new EditText();
    editText->setId(VIEW_ID_EDITTEXT);
    editText->setSize(0, 200, 200, 40);
    editText->setStyleColor(0xFFFFFFFF);
    editText->setTextAlignment(TEXT_ALIGN_LEFT);
    editText->setTextColor(0xFFFFFFFF);
    editText->setHintText("提示文字");
    editText->setHintTextColor(0xFFFF0000);
    editText->setTextFont(FontManager::getFont(DEFAULT_FONT_NAME, 30));
    editText->setListener(*this);
    editText->setInputType(EditText::INPUT_TYPE_PASSWORD); //以星号显示隐藏文本
    editText->setImeType(IME_TYPE_ALL, IME_TYPE_ENGLISH);
*/
//@brief 可编辑文本控件
//@author cvte
//@description
class EditText : public TextView {
   public:
    friend class InputMethodManager;
    typedef enum {
        INPUT_TYPE_NONE, //不限制
        INPUT_TYPE_PASSWORD, //不可以见的密码
    } INPUT_TYPE;
    class EditTextListener {
       public:
        //@method EditText的文本改变时触发的回调
        virtual void onEditTextTextChanged(EditText& editText, const char* text);
        //@method EditText焦点改变时触发的回调
        virtual void onEditTextFocusChanged(EditText& editText, bool isFocus);
    };

    EditText();
    ~EditText();
    //@method 设置显示文本
    void setText(const char* text);
    //@method 设置显示文本，如果shouldTriggerCallback为true会触发回调，否则不触发
    void setText(const char* text, bool shouldTriggerCallback);
    //@method 获取显示的文本，如果是password类型也会返回真实的内容
    const char* getText();
    //@method 设置提示文本
    void setHintText(const char* hint);
    //@method 设置提示文本的颜色
    void setHintTextColor(int color);
    //@method setInputType(int type)
    //@description
    // 限制输入类型
    // number:整数类型
    // numberDecimal:小数点类型
    // date:日期类型
    // text:文本类型(默认值)
    // phone:拨号键盘
    // textPassword:密码
    // textVisiblePassword:可见密码
    // textUri:网址
    void setInputType(INPUT_TYPE type);
    //@method 设置输入法支持状态和默认状态
    void setImeType(int imeType, IME_TYPE defaultImeType);
    void setMaxLines(int maxlines);
    //@method void setLines(int lines);
    //@description 设置文本显示行数
    void setLines(int lines);
    //@method void setSingleLine();
    //@description 设置单行显示
    void setSingleLine();
    //@method 设置焦点, isFocus是否获取焦点
    void setFocus(bool isFocus);
    //@method 获取焦点
    bool getFocus();
    //@method 设置风格颜色，包括下划线和光标，默认白色
    void setStyleColor(int color);
    //@method 设置是否绘制下划线
    void setUnderlineVisible(bool isVisible);
    //@method 设置监听器
    void setListener(EditTextListener& listener);

   protected:
    void onDraw(Canvas& canvas);
    void onFocusChanged(bool isFocus);
    void onClicked();

    //@method 设置是否一直显示光标，用于输入法输入状态
    void setCursorShowAlways(bool always);

   private:
    int mWidthSet = 0; //设置的宽度，编辑框的宽度会根据文本内容增加，保存此数值用于恢复
    INPUT_TYPE mInputType = INPUT_TYPE_NONE;
    int mImeType = IME_TYPE_ALL; //支持的输入法状态
    IME_TYPE mImeTypeDefault = IME_TYPE_ENGLISH; //默认输入法状态
    std::string mPasswordText;
    int mStyleColor = 0xFFFFFFFF;
    std::string mHintText;
    int mHintTextColor = 0xFFFFFFFF;
    int mUnderlineHeight = 2; //下划线宽度
    bool mUnderlineIsVisible = true; //下划线是否可见
    int mCursorWidth = 2; //光标宽度
    long mCursorTimerTaskId = -1;
    Timer mCursorTimer; //光标闪烁定时器
    bool mCursorShouldPrint = false; //是否要绘制光标
    bool mCursorShowAlways = false; //是否一直显示光标，用于输入法输入状态下
    EditTextListener* mListener = nullptr; //监听器
};

#endif